﻿#ifndef HMIMODULE_H
#define HMIMODULE_H

// 前向声明
class QWidget;
class QTabWidget;
class QPushButton;
class QColor;
class QPointF;
#include "hmi_graphics_scene.h"
#include "hmi_element.h"
#include "module_interface.h"
#include "hmi_library_export.h"

// 前向声明
class ModbusManager;
#include <QObject>
#include <QList>
#include <QMap>
#include <QVector>

// HMI模块核心类，负责管理HMI界面组件、页面和Modbus联动
class HMI_LIBRARY_API HMIModule : public IModule
{
    Q_OBJECT
public:
    explicit HMIModule(QWidget* ui, ModbusManager* modbusManager, QObject *parent = nullptr);
    // 初始化信号槽
    void initSignalSlot();
    // 按钮的槽函数
    void buttonSignalSlot();
    // 设置按钮图标
    void setButtonStyle(QPushButton* button, const QString& iconPath);
    // 初始化HMI模块,创建工具栏、图形场景
    void init() override;
    // 保存当前HMI配置到文件
    bool saveToFile(const QString& filePath) override;
    // 从文件加载HMI配置
    bool openFromFile(const QString& filePath) override;
    // 重置页面，清空所有页，只保留一个空的第一页
    void resetPages();
    // 判断是否有未保存的修改
    bool isModified() const override;
    // 设置修改状态，用于判断是否需要保存
    void setModified(bool modified) override;
    // 获取Modbus管理器指针
    ModbusManager* getModbusManager() const;
    // 重新注册所有线圈的方法
    void againRegisterAllCoils();

    // IModule接口实现
    void reset() override;
    QString getFileFilter() const override;
    QString getModuleName() const override;

    // 仿真相关方法实现
    void startSimulation(const QString& serialPort, int baudRate, int dataBits, int stopBits, int parity) override;
    void stopSimulation() override;
    bool isSimulationRunning() const override;
    
    // 设置Modbus管理器
    void setModbusManager(ModbusManager* modbusManager) override;
    
    // 实现IModule接口的Modbus数据更新方法
    void onCoilUpdated(int address, bool value) override;
    void onRegisterUpdated(int address, quint16 value) override;

private Q_SLOTS:
    // 准备创建按钮组件，响应工具栏按钮点击
    void prepareToCreateButton();
    // 准备创建指示灯组件，响应工具栏按钮点击
    void prepareToCreateIndicator();
    // 组件创建完成后的初始化，连接信号、设置属性
    void onComponentCreated(HmiComponent* item);
    // 处理复制组件请求
    void onCopyRequested();
    // 处理粘贴组件请求，在指定位置粘贴
    void onPasteRequested(const QPointF& scenePos);
    // 处理删除组件请求
    void onDeleteRequested();
    // 添加新页面
    void addPage();
    // 删除当前页面
    void deletePage();
    // 切换到上一页
    void prePage();
    // 切换到下一页
    void nextPage();
    // 处理修改组件 ON状态 颜色的请求
    // void onChangeOnColorRequested(HmiComponent* item);
    // 处理修改组件 OFF状态 颜色的请求
    void onChangeOffColorRequested(HmiComponent* item);

private:
    // 初始化新创建的组件，连接信号、设置初始状态等
    void setupNewComponent(HmiComponent* item);
    // 根据Modbus地址更新组件状态
    void updateByAddress(int address, bool on);
    // 获取当前场景
    HmiGraphicsScene* getCurrentScene() const;
    // 根据类型字符串创建组件
    HmiComponent* createByTypeName(const QString& type) const;
    // 创建新页面
    QWidget* createNewPage(const QString& pageName, QTabWidget* tabWidget);

private:
    QWidget* ui_;                      // 主窗口UI指针
    HmiGraphicsScene* scene_;       // 图形场景，用于绘制HMI组件
    ModbusManager *modbusManager_;     // Modbus管理器指针，用于通信交互
    QPushButton* button_;              // 按钮
    QPushButton* lamp_;                // 指示灯
    QPushButton* addPage_;             // 添加页面
    QPushButton* deletePage_;          // 删除页面
    QPushButton* prePage_;             // 上一页
    QPushButton* nextPage_;            // 下一页
    ComponentType copiedType_;         // 复制的组件类型，按钮/指示灯
    QColor copiedColor_;               // 复制的组件颜色
    QColor copiedOnColor_;             // 复制的组件 ON状态 颜色
    QColor copiedOffColor_;            // 复制的组件 OFF状态 颜色
    QString copiedComponentName_;      // 复制的组件名称
    int copiedAddress_ = 0;            // 复制的组件关联的Modbus地址
    double copiedWidth_ = 0.0;         // 复制的组件宽度
    double copiedHeight_ = 0.0;        // 复制的组件高度
    bool hasCopiedItem_ = false;       // 是否有已复制的组件，用于粘贴判断
    int pageCount_ = 1;                // 页面计数器，用于新页面编号
    QList<int> availablePageNumbers_;  // 可用的页面编号，删除页面后回收编号
    bool isModified_ = false;          // 修改标志，判断是否需要保存

};

#endif // HMIMODULE_H
